package com.bpms.atmp.clienttools;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.bpms.atmp.client.common.GVO;
import com.bpms.atmp.client.common.GVOL;
import com.bpms.atmp.client.common.GVOList;
import com.bpms.common.VO;
import com.bpms.common.VOL;
import com.bpms.common.VOList;

public class TransferTool {
	public static TransferTool tt=new TransferTool();
	
	public static TransferTool I(){
		return tt;
	}
	
	@SuppressWarnings("rawtypes")
	public GVO changeToGVO(VO vo){
		
		GVO gvo=new GVO();
		gvo.setVoType(vo.voType);
		if(vo.getOrderKeys().size()>0){
			for(int i=0;i<vo.getOrderKeys().size();i++){
				String key=(String)vo.getOrderKeys().get(i);
				String value=vo.getAttr(key);
				gvo.setAttrInOrder(key,value);
				vo.remove(key);
			}
		}
		
		Hashtable hs=vo.attrs();
		Set set=hs.keySet();
		Iterator it=set.iterator();
		while(it.hasNext()){
			String key=(String)it.next();
			Object value=hs.get(key);
			if(value instanceof String){
				gvo.setAttr(key, (String)value);
			}else if(value instanceof VO){
				gvo.setGVO(key, new TransferTool().changeToGVO((VO)value));
			}else if(value instanceof VOL){
				gvo.setGVOL(key,changeToGVOL((VOL)value));
			}else if(value instanceof VOList){
				gvo.setGVOList(key,changeToGVOList((VOList)value));
			}
		}
		return gvo;
	}
	
	public VO changeToVO(GVO gvo){
		VO vo=new VO();
		vo.voType=gvo.getVoType();
		Map<String,GVO> mg=gvo.getMapGVO();
		Map<String,GVOList> mgl=gvo.getMapGVOList();
		Map<String,String> ms=gvo.getMapStr();
		Map<String,GVOL> mgvol=gvo.getMapGVOL();
		Set<String> set;
		Iterator<String> it;
		if(ms!=null){
			set=ms.keySet();
			it=set.iterator();
			while(it.hasNext()){
				String key=it.next();
				vo.setAttr(key, ms.get(key));
			}
			
		}
		
		if(mg!=null){
			set=mg.keySet();
			it=set.iterator();
			while(it.hasNext()){
				String key=it.next();
				VO t=new TransferTool().changeToVO(mg.get(key));
				vo.setObj(key, t);
			}
		}
		
		if(mgl!=null){
			set=mgl.keySet();
			it=set.iterator();
			while(it.hasNext()){
				String key=it.next();
				VOList volist=changeToVOList(mgl.get(key));
				vo.setObj(key, volist);
			}
		}
		
		if(mgvol!=null){
			set=mgvol.keySet();
			it=set.iterator();
			while(it.hasNext()){
				String key=it.next();
				VOL vol=changeToVOL(mgvol.get(key));
				vo.setObj(key, vol);
			}
		}
		return vo;
		
	}
	
	
	@SuppressWarnings("unchecked")
	private VOList changeToVOList(GVOList g){
		VOList vect=new VOList();
		vect.columns=g.columns;
		for(int i=0;i<g.listData.size();i++){
			VO v=changeToVO((GVO)g.listData.get(i));
			vect.listData.add(v);
		}
		return vect;
	}
	
	@SuppressWarnings("unchecked")
	private VOL changeToVOL(GVOL g){
		VOL vect=new VOL();
		vect.columns=g.columns;
		vect.headers=g.headers;
		vect.types=g.types;
		for(int i=0;i<g.listData.size();i++){
			VO v=changeToVO((GVO)g.listData.get(i));
			vect.listData.add(v);
		}
		return vect;
	}
	
	
	private GVOList changeToGVOList(VOList v){
		GVOList vect=new GVOList();
		vect.columns=v.columns;
		for(int i=0;i<v.listData.size();i++){
			vect.listData.add(changeToGVO((VO)v.listData.get(i)));
		}
		return vect;
	}
	
	
	private GVOL changeToGVOL(VOL v){
		GVOL vect=new GVOL();
		vect.columns=v.columns;
		vect.headers=v.headers;
		vect.types=v.types;
		for(int i=0;i<v.listData.size();i++){
			vect.listData.add(changeToGVO((VO)v.listData.get(i)));
		}
		return vect;
	}
}
